////
////  TSCLinerLayout.m
////  Tsc_IOS
////
////  Created by Rio on 15-6-4.
////  Copyright (c) 2015年 idream. All rights reserved.
////
//// 使用方法同Android
////
//// -- TODO padding处理的代码还不够好，应该优化一下，不要东一个西一个
//// -- TODO 还没有加入横向padding的处理
//
//
//typedef struct {
//    CGFloat w;
//    CGFloat h;
//} WH;
//
//#import "DEL_TSCLinerLayout.h"
//#import "TSCConstants.h"
//#import "TSCMyUIUtil.h"
//#import "TSCMyDialog2.h"
//#import "TSCMyGCSelector.h"
//
//@implementation DEL_TSCLinerLayout {
////    BOOL _directlySetSelfFrame; // 如果是在该程序中直接设置self.frame，则重写的setFrame()中，不必再进行重新布局，否则将导致死循环
//    NSMutableDictionary * _svIgnoreLockDic; // key：每一个子view的内存地址字符串；value：1 // 表示当在该程序中手工设置子view大小后，监听者捕获子view大小变化的消息后，不再重复设置子view大小，避免死循环
//    NSMutableDictionary * _svHasRemovedManually; // key: 每一个“将要”被删除的子view的内存地址字符串；value：1 // 表示这个子view已经在该程序中手工移除，而不必再次调用父类监听子view将要被移除的回调，避免死循环
//    
//    InnerObserverLinerLayoutWH * _observerSelfWH;
//}
//
//#pragma mark 初始化
//
//- (id)initWithFrame:(CGRect)frame {
//    self = [super initWithFrame:frame];
//    if (self) {
//        // Initialization code
//        [self initLinerLayout];
//    }
//    return self;
//}
//
//- (id) init {
//    // 注：通过父类init进行初始化，已被废弃，不再使用。因为UIView中的init应该是这样实现的：[super initWithFrame]，这样会导致再次调用LinerLayout的initWithFrame，从而使LinerLayout的myInit被执行两次
////    self = [super init];
////    if (self) {
////        // do nothing
////        
////        [self myInit];
////    }
//    self = [self initWithFrame:CGRectMake(0, 0, 0, 0)];
//    return self;
//}
//
//// 当从Storyboard加载时，必须重写此方法，否则将导致类属性无法初始化
//- (id) initWithCoder:(NSCoder *)aDecoder {
//    // 注：自定义初始化必须在super之前，否则类属性无法得到初始化
//    [self initLinerLayout];
//    
//    // self = [super init]; // 注：不能使用[super init]，将导致无法获得Storyboard上的UIView，仅初始化了自身
//    _directlySetSelfFrame = YES; // 注：[super initWithCoder]将导致setFrame()被执行，为了保证能从Storyboard中获得宽高，所以需要设置标识位
//    self = [super initWithCoder:aDecoder];
//    if (self) {
//        // do nothing
//    }
//    return self;
//}
//
////- (void) dealloc {
////    // 移除监听者
////    [_observerSelfWH removeObserver];
////}
//
///*
// // Only override drawRect: if you perform custom drawing.
// // An empty implementation adversely affects performance during animation.
// - (void)drawRect:(CGRect)rect
// {
// // Drawing code
// }
// */
//
//// UIView（系统）的布局方法
//- (void) layoutSubviews {
//    // do nothing
//    // 注：所有需要对所有子view及自身重新布局的情况，都通过自定义的方法实现调用了，系统自动调用时，可以不必实现，否则就重复调用了
//}
//
//#pragma mark 私有方法
//
//// 自定义初始化方法
///* private */ - (void) initLinerLayout {
//    // 设置各属性的默认值
//    _orientation = LinerLayoutOrientationVertical;
//    _layoutWidth = LayoutWHTypeNone;
//    _layoutHeight = LayoutWHTypeNone;
//    _gravity = (LayoutGravityLeft|LayoutGravityTop);
//    _vPadding = _hPadding = 0;
//    
//    _directlySetSelfFrame = NO;
//    _svIgnoreLockDic = [NSMutableDictionary dictionary];
//    _svHasRemovedManually = [NSMutableDictionary dictionary];
//    
//    // 注册监听者
//    _observerSelfWH = [[InnerObserverLinerLayoutWH alloc] initWithLinerLayout:self];
//    
//    // 注册事件——监听屏幕转动
//    //    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
//}
//
//#pragma mark 公共方法
//
//- (void) relayoutSubviewsAndResetSelfWH {
//    
//    // ===== 计算所有子view的最大宽高、总宽高
//    
//    NSArray * svArray = [self subviews]; // 获得所有子view
//    int svArrayCount = [svArray count];
//    
//    CGFloat maxSVW = 0; // 所有子view中的最大宽度
//    CGFloat maxSVH = 0; // 所有子view中的最大高度
//    CGFloat totalSVW = 0; // （横向排列时）所有子view的总宽度
//    CGFloat totalSVH = 0; // （纵向排列时）所有子view的总高度
//
//    for (int i = 0; i < svArrayCount; i++) {
//        UIView * sv = [svArray objectAtIndex:i];
//        
//        // 保存子view中的最大宽高
//        if (sv.frame.size.width > maxSVW) {
//            maxSVW = sv.frame.size.width;
//        }
//        if (sv.frame.size.height > maxSVH) {
//            maxSVH = sv.frame.size.height;
//        }
//        
//        // 保存所有子view总宽高
//        totalSVW += sv.frame.size.width;
//        totalSVH += sv.frame.size.height;
//        
//        // 对所有子view总宽高，加入padding
//        if (i >= 1) { // 从第二个子view开始
//            if (_orientation == LinerLayoutOrientationVertical) {
//                totalSVH += _vPadding;
//            } else if (_orientation == LinerLayoutOrientationHorizontal) {
//                totalSVW += _hPadding;
//            }
//        }
//    }
//    
//    
//    // ===== 设置自身宽高
//    
//    // 计算自身宽高
//    // 注：任何变量一定要赋初值，否则将导致IOS不可预知的错误。这个错误找了我1整天！因为WH没有赋初值，导致多个LinerLayout同时显示时，屏幕黑屏，且每个LinerLayout的y值始终被赋值为0。但单个LinerLayout没有这个问题。
//    WH selfWH = {0, 0};
//    if (_layoutWidth == LayoutWHTypeMatchParent) {
//        selfWH.w = self.superview.frame.size.width;
//    } else if (_layoutWidth == LayoutWHTypeWrapContent) {
//        if (_orientation == LinerLayoutOrientationVertical) {
//            selfWH.w = maxSVW;
//        } else if (_orientation == LinerLayoutOrientationHorizontal) {
//            selfWH.w = totalSVW;
//        }
//    } else {
//        // 保持自身宽高不变
//        selfWH.w = self.frame.size.width;
//    }
//    if (_layoutHeight == LayoutWHTypeMatchParent) {
//        selfWH.h = self.superview.frame.size.height;
//    } else if (_layoutHeight == LayoutWHTypeWrapContent) {
//        if (_orientation == LinerLayoutOrientationVertical) {
//            selfWH.h = totalSVH;
//        } else if (_orientation == LinerLayoutOrientationHorizontal) {
//            selfWH.h = maxSVH;
//        }
//    } else {
//        // 保持自身宽高不变
//        selfWH.h = self.frame.size.height;
//    }
//    
//    // 更新自身宽高
//    _directlySetSelfFrame = YES;
//    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, selfWH.w, selfWH.h);
//
//    
////    // ===== 如果直接子view也为LinerLayout，且宽/高为matchParent，则立即调整子view的宽高
////    for (UIView * sv in svArray) {
////        if ([sv isKindOfClass: [TSCLinerLayout class]]) { // 注：这里不能用[self class]来判断子view类是否是LinerLayout，因为子view有可能继承LinerLayout（比如GCSelector），这样，[self class]得到的就是GCSelector，而不是LinerLayout！
////            TSCLinerLayout * sv2 = (TSCLinerLayout *)sv;
////            CGFloat svw = -1;
////            CGFloat svh = -1;
////        
////            if (sv2.layoutWidth == LayoutWHTypeMatchParent) {
////                svw = self.frame.size.width;
////            }
////            if (sv2.layoutHeight == LayoutWHTypeMatchParent) {
////                svh = self.frame.size.height;
////            }
////            
////            if (svw != -1 || svh != -1) {
////                [_svIgnoreLockDic setObject:[NSNumber numberWithBool:YES] forKey:[NSString stringWithFormat:@"%p", sv2]];
////                sv2.directlySetSelfFrame = YES; // 设置直接子view是被直接调整的，避免死循环
////                [TSCMyUIUtil setUIRect:sv2 x:-1 y:-1 w:svw h:svh];
////                [_svIgnoreLockDic removeObjectForKey:[NSString stringWithFormat:@"%p", sv2]];
////            }
////        }
////    }
//    
//    // ===== 计算nextSVX、nextSVY的起始值
//    
//    CGFloat selfW = self.frame.size.width;
//    CGFloat selfH = self.frame.size.height;
//    CGFloat nextSVX = 0; // （横向排列时）计算下一个子view布局时，x值应该是多少
//    CGFloat nextSVY = 0; // （纵向排列时）计算下一个子view布局时，y值应该是多少
//    
//    if (_orientation == LinerLayoutOrientationVertical) {
//        if (_gravity & LayoutGravityLeft) {
//            if (_gravity & (LayoutGravityTop | LayoutGravityCenterVertical | LayoutGravityBottom | LayoutGravityCenter)) {
//                // do nothing 让给优先级更高的规则进行设置
//            } else {
//                nextSVY = 0;
//            }
//        }
//        if (_gravity & LayoutGravityCenterHorizontal) {
//            if (_gravity & (LayoutGravityTop | LayoutGravityCenterVertical | LayoutGravityBottom | LayoutGravityCenter)) {
//                // do nothing 让给优先级更高的规则进行设置
//            } else {
//                nextSVY = 0;
//            }
//        }
//        if (_gravity & LayoutGravityRight) {
//            if (_gravity & (LayoutGravityTop | LayoutGravityCenterVertical | LayoutGravityBottom | LayoutGravityCenter)) {
//                // do nothing 让给优先级更高的规则进行设置
//            } else {
//                nextSVY = 0;
//            }
//        }
//        if (_gravity & LayoutGravityTop) {
//            nextSVY = 0;
//        }
//        if (_gravity & LayoutGravityCenterVertical) {
//            nextSVY = selfH / 2 - totalSVH / 2;
//        }
//        if (_gravity & LayoutGravityBottom) {
//            nextSVY = selfH - totalSVH;
//        }
//        if (_gravity & LayoutGravityCenter) {
//            nextSVY = selfH / 2 - totalSVH / 2;
//        }
//    } else if (_orientation == LinerLayoutOrientationHorizontal) {
//        if (_gravity & LayoutGravityLeft) {
//            nextSVX = 0;
//        }
//        if (_gravity & LayoutGravityCenterHorizontal) {
//            nextSVX = selfW / 2 - totalSVW / 2;
//        }
//        if (_gravity & LayoutGravityRight) {
//            nextSVX = selfW - totalSVW;
//        }
//        if (_gravity & LayoutGravityTop) {
//            if (_gravity & (LayoutGravityLeft | LayoutGravityCenterHorizontal | LayoutGravityRight | LayoutGravityCenter)) {
//                // do nothing 让给优先级更高的规则进行设置
//            } else {
//                nextSVX = 0;
//            }
//        }
//        if (_gravity & LayoutGravityCenterVertical) {
//            if (_gravity & (LayoutGravityLeft | LayoutGravityCenterHorizontal | LayoutGravityRight | LayoutGravityCenter)) {
//                // do nothing 让给优先级更高的规则进行设置
//            } else {
//                nextSVX = 0;
//            }
//        }
//        if (_gravity & LayoutGravityBottom) {
//            if (_gravity & (LayoutGravityLeft | LayoutGravityCenterHorizontal | LayoutGravityRight | LayoutGravityCenter)) {
//                // do nothing 让给优先级更高的规则进行设置
//            } else {
//                nextSVX = 0;
//            }
//        }
//        if (_gravity & LayoutGravityCenter) {
//            nextSVX = selfW / 2 - totalSVW / 2;
//        }
//    }
//    
//    // ===== 计算所有子view坐标数组
//    
//    CGFloat svX = 0; // 每次计算时，子view的x
//    CGFloat svY = 0; // 每次计算时，子view的y
//    CGFloat svW = 0; // 每次计算时，子view的w
//    CGFloat svH = 0; // 每次计算时，子view的h
//    NSMutableArray * svXYArray = [NSMutableArray array];
//    
//    for (int i = 0, max = [svArray count]; i < max; i++) {
//        UIView * sv = [svArray objectAtIndex:i];
//        
//        svW = sv.frame.size.width;
//        svH = sv.frame.size.height;
//        
//        if (_orientation == LinerLayoutOrientationVertical) { // 纵向排列
//            // 计算子view坐标
//            if (_gravity & LayoutGravityLeft) {
//                svX = 0;
//                svY = nextSVY;
//            }
//            if (_gravity & LayoutGravityCenterHorizontal) {
//                svX = selfW / 2 - svW / 2;
//                svY = nextSVY;
//            }
//            if (_gravity & LayoutGravityRight) {
//                svX = selfW - svW;
//                svY = nextSVY;
//            }
//            if (_gravity & LayoutGravityTop) {
//                if (_gravity & (LayoutGravityLeft | LayoutGravityCenterHorizontal | LayoutGravityRight | LayoutGravityCenter)) {
//                    // do nothing 让给优先级更高的规则进行设置
//                } else {
//                    svX = 0;
//                }
//                
//                svY = nextSVY;
//            }
//            if (_gravity & LayoutGravityCenterVertical) {
//                if (_gravity & (LayoutGravityLeft | LayoutGravityCenterHorizontal | LayoutGravityRight | LayoutGravityCenter)) {
//                    // do nothing 让给优先级更高的规则进行设置
//                } else {
//                    svX = 0;
//                }
//                
//                svY = nextSVY;
//            }
//            if (_gravity & LayoutGravityBottom) {
//                if (_gravity & (LayoutGravityLeft | LayoutGravityCenterHorizontal | LayoutGravityRight | LayoutGravityCenter)) {
//                    // do nothing 让给优先级更高的规则进行设置
//                } else {
//                    svX = 0;
//                }
//                
//                svY = nextSVY;
//            }
//            if (_gravity & LayoutGravityCenter) {
//                svX = selfW / 2 - svW / 2;
//                svY = nextSVY;
//            }
//            
//            // 对svY加入padding
//            if (i >= 1) { // 从第二个子view开始
//                svY += _vPadding;
//            }
//            
//            // 将子view坐标加入到数组中
//            [svXYArray addObject:[NSValue valueWithCGPoint:CGPointMake(svX, svY)]];
//            
//            // 更新nextSVY
//            nextSVY += sv.frame.size.height;
//            
//            // 对nextSVY加入padding
//            if (i >= 1) { // 从第二个子view开始
//                nextSVY += _vPadding;
//            }
//        } else { // 横向排列
//            // 计算子view坐标
//            if (_gravity & LayoutGravityLeft) {
//                svX = nextSVX;
//                
//                if (_gravity & (LayoutGravityTop | LayoutGravityCenterVertical | LayoutGravityBottom | LayoutGravityCenter)) {
//                    // do nothing 让给优先级更高的规则进行设置
//                } else {
//                    svY = 0;
//                }
//            }
//            if (_gravity & LayoutGravityCenterHorizontal) {
//                svX = nextSVX;
//                
//                if (_gravity & (LayoutGravityTop | LayoutGravityCenterVertical | LayoutGravityBottom | LayoutGravityCenter)) {
//                    // do nothing 让给优先级更高的规则进行设置
//                } else {
//                    svY = 0;
//                }
//            }
//            if (_gravity & LayoutGravityRight) {
//                svX = nextSVX;
//                
//                if (_gravity & (LayoutGravityTop | LayoutGravityCenterVertical | LayoutGravityBottom | LayoutGravityCenter)) {
//                    // do nothing 让给优先级更高的规则进行设置
//                } else {
//                    svY = 0;
//                }
//            }
//            if (_gravity & LayoutGravityTop) {
//                svX = nextSVX;
//                svY = 0;
//            }
//            if (_gravity & LayoutGravityCenterVertical) {
//                svX = nextSVX;
//                svY = selfH / 2 - svH / 2;
//            }
//            if (_gravity & LayoutGravityBottom) {
//                svX = nextSVX;
//                svY = selfH - svH;
//            }
//            if (_gravity & LayoutGravityCenter) {
//                svX = nextSVX;
//                svY = selfH / 2 - svH / 2;
//            }
//            
//            // 对svX加入padding
//            if (i >= 1) { // 从第二个子view开始
//                svX += _hPadding;
//            }
//            
//            // 将子view坐标加入到数组中
//            [svXYArray addObject:[NSValue valueWithCGPoint:CGPointMake(svX, svY)]];
//            
//            // 更新nextSVX
//            nextSVX += sv.frame.size.width;
//            
//            // 对nextSVX加入padding
//            if (i >= 1) { // 从第二个子view开始
//                nextSVX += _hPadding;
//            }
//        }
//    }
//    
//    // 重新布局子view
//    for (int i = 0, max = [svArray count]; i < max; i++) {
//        CGPoint svXY = [[svXYArray objectAtIndex:i] CGPointValue];
//        
//        UIView * sv = [svArray objectAtIndex:i];
//        [_svIgnoreLockDic setObject:[NSNumber numberWithBool:YES] forKey:[NSString stringWithFormat:@"%p", sv]];
//        // 如果直接子view也是LinerLayout，则需要跳过直接子view对自身的设置，否则将导致死循环
//        if ([sv isKindOfClass: [TSCLinerLayout class]]) { // 注：这里不能用[self class]来判断子view类是否是LinerLayout，因为子view有可能继承LinerLayout（比如GCSelector），这样，[self class]得到的就是GCSelector，而不是LinerLayout！
//            TSCLinerLayout * sv2 = (TSCLinerLayout *)sv;
//            sv2.directlySetSelfFrame = YES;
//        }
//        [TSCMyUIUtil setUIRect:sv x:svXY.x y:svXY.y w:-1 h:-1];
//        [_svIgnoreLockDic removeObjectForKey:[NSString stringWithFormat:@"%p", sv]];
//    }
//    
//}
//
//
//#pragma mark 需要调用自定义重新布局方法的情况
//
//// 以下几种情况，需要对自身的大小、所有子view的位置，进行重新布局
//// 1 添加子view时
//// 2 子view从自身移除时
//// 3 任意一个子view大小、位置变化时（子view位置发生变化，是为了忽略子view位置的变化，保持LinerLayout中各子view本来的布局）
//// 4 自身被添加到父view时（TODO：没必要吧？因为子view都是相对布局）
//// 5 自身大小、位置变化时（TODO：位置没必要吧？因为子view都是相对布局）
//// 6 父view大小发生变化时（比如子view、父view都是LinerLayout，且子view的width为match_parent，当父view宽度变化时，子view也随之变化）
//// 7 重新设置了影响布局的自定义类属性（比如orientation、whType等）时
//// 8 TODO 屏幕旋转时
//
//// == 1
//- (void) didAddSubview:(UIView *)subview {
//    // 对每一个子view都注册一个监听者
//    // TODO 为什么这一句必须写在重新布局之前？！
//    [subview addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
//    [subview addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew context:nil];
//    
//    // 重新布局
//    [self relayoutSubviewsAndResetSelfWH];
//}
//
//// == 2
//- (void) willRemoveSubview:(UIView *)subview {
//    // 方法一：
//    // 等待一小段时间后，等待子view从父view彻底移除后，再进行重新布局
//    //    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//    ////        [NSThread sleepForTimeInterval:0.00000000000000000001];
//    //
//    //        dispatch_async(dispatch_get_main_queue(), ^{
//    //            [self relayoutSubviewsAndResetSelfWH];
//    //        });
//    //    });
//    
//    // 方法二：
//    // 参考：http://www.cnblogs.com/dagehaoshuang/p/4012870.html
//    if ([_svHasRemovedManually objectForKey:[NSString stringWithFormat:@"%p", subview]] == nil) { // 还没有被手工移除
//        // 标记将要被手工移除
//        [_svHasRemovedManually setObject:[NSNumber numberWithBool:YES] forKey:[NSString stringWithFormat:@"%p", subview]];
//        [subview removeObserver:self forKeyPath:@"frame"]; // 将注册在每一个子view下的监听者移除，否则将导致LinerLayout从父view移除时，报错：An instance 0x9e97d00 of class TSCLinerLayout was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:...
//        [subview removeObserver:self forKeyPath:@"bounds"];
//        [subview removeFromSuperview]; // 再调用一次removeFromSuperview，这样调用完毕该方法，那么表明该subview已经被移除了
//        [self relayoutSubviewsAndResetSelfWH]; // 重新布局
//    } else { // 曾被标记手工删除，不再进行删除，直接退出
//        // 取消标记
//        [_svHasRemovedManually removeObjectForKey:[NSString stringWithFormat:@"%p", subview]];
//        return;
//    }
//    
//}
//
//// == 3
//// 监听子view大小、位置变化的消息（子view已经变化过了）
//- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
//    if ([_svIgnoreLockDic objectForKey:[NSString stringWithFormat:@"%p", object]] != nil) {
//        [_svIgnoreLockDic removeObjectForKey:[NSString stringWithFormat:@"%p", object]];
//        return;
//    }
//    
//    if ([keyPath isEqualToString:@"frame"] || [keyPath isEqualToString:@"bounds"] || [keyPath isEqualToString:@"center"]) {
//        // 重新布局
//        [self relayoutSubviewsAndResetSelfWH];
//    }
//}
//
//// == 4
//- (void) didMoveToSuperview {
//    // 重新布局
//    [self relayoutSubviewsAndResetSelfWH];
//}
//
//
//// == 5
//// 通过监听者实现
//
//// == 6
//
//// == 7
//- (void) setLayoutWidth:(LayoutWHType)layoutWidth {
//    if (_layoutWidth != layoutWidth) {
//        _layoutWidth = layoutWidth;
//        
//        // 重新布局
//        [self relayoutSubviewsAndResetSelfWH];
//    }
//}
//- (void) setLayoutHeight:(LayoutWHType)layoutHeight {
//    if (_layoutHeight != layoutHeight) {
//        _layoutHeight = layoutHeight;
//        
//        // 重新布局
//        [self relayoutSubviewsAndResetSelfWH];
//    }
//}
//- (void) setOrientation:(LinerLayoutOrientation)orientation {
//    if (_orientation != orientation) {
//        _orientation = orientation;
//        
//        // 重新布局
//        [self relayoutSubviewsAndResetSelfWH];
//    }
//}
//- (void) setGravity:(LayoutGravity)gravity {
//    if (_gravity != gravity) {
//        _gravity = gravity;
//        
//        // 重新布局
//        [self relayoutSubviewsAndResetSelfWH];
//    }
//}
//
//// == 8 TODO
//- (void)orientChange:(NSNotification *)noti {
//    //    UIDeviceOrientation  orient = [UIDevice currentDevice].orientation;
//    //    NSLog(@"屏幕转动了！%i", orient);
//}
//
//@end
//
//#pragma mark 辅助类（意义上的“内部类”，其实是public）
//
//@implementation InnerObserverLinerLayoutWH {
//    TSCLinerLayout * _ll;
//}
//
//- (id) initWithLinerLayout:(TSCLinerLayout *)linerLayout {
//    self = [super init];
//    if (self) {
//        _ll = linerLayout;
//        
//        // 设置监听者
//        [_ll addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
//        [_ll addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew context:nil];
//    }
//    return self;
//}
//
//- (void) dealloc {
//    // 注销监听者
//    [self removeObserver];
//}
//
//- (void) removeObserver {
//    [_ll removeObserver:self forKeyPath:@"frame"];
//    [_ll removeObserver:self forKeyPath:@"bounds"];
//}
//
//- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
//    if ([keyPath isEqualToString:@"frame"] || [keyPath isEqualToString:@"bounds"]) {
//        if (_ll.directlySetSelfFrame == YES) { // 代码直接调整，不需要重新布局
//            _ll.directlySetSelfFrame = NO; // 调整完后再恢复回来，否则将导致后续在外层程序设置frame/bounds时，无法调起relayoutSubviewsAndResetSelfWH()
//            return;
//        } else { // 其他情况调整，需要重新布局
//            NSLog(@"我在else分支中，值为：%i", _ll.directlySetSelfFrame);
//            [_ll relayoutSubviewsAndResetSelfWH];
//        }
//    }
//}
//
//
//@end